home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / acpi / processor.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.8 KB  |  356 lines

  1. #ifndef __ACPI_PROCESSOR_H
  2. #define __ACPI_PROCESSOR_H
  3.  
  4. #include <linux/kernel.h>
  5. #include <linux/cpu.h>
  6. #include <linux/cpuidle.h>
  7. #include <linux/thermal.h>
  8. #include <asm/acpi.h>
  9.  
  10. #define ACPI_PROCESSOR_BUSY_METRIC    10
  11.  
  12. #define ACPI_PROCESSOR_MAX_POWER    8
  13. #define ACPI_PROCESSOR_MAX_C2_LATENCY    100
  14. #define ACPI_PROCESSOR_MAX_C3_LATENCY    1000
  15.  
  16. #define ACPI_PROCESSOR_MAX_THROTTLING    16
  17. #define ACPI_PROCESSOR_MAX_THROTTLE    250    /* 25% */
  18. #define ACPI_PROCESSOR_MAX_DUTY_WIDTH    4
  19.  
  20. #define ACPI_PDC_REVISION_ID        0x1
  21.  
  22. #define ACPI_PSD_REV0_REVISION        0    /* Support for _PSD as in ACPI 3.0 */
  23. #define ACPI_PSD_REV0_ENTRIES        5
  24.  
  25. #define ACPI_TSD_REV0_REVISION        0    /* Support for _PSD as in ACPI 3.0 */
  26. #define ACPI_TSD_REV0_ENTRIES        5
  27. /*
  28.  * Types of coordination defined in ACPI 3.0. Same macros can be used across
  29.  * P, C and T states
  30.  */
  31. #define DOMAIN_COORD_TYPE_SW_ALL    0xfc
  32. #define DOMAIN_COORD_TYPE_SW_ANY    0xfd
  33. #define DOMAIN_COORD_TYPE_HW_ALL    0xfe
  34.  
  35. #define ACPI_CSTATE_SYSTEMIO    0
  36. #define ACPI_CSTATE_FFH        1
  37. #define ACPI_CSTATE_HALT    2
  38.  
  39. #define ACPI_CX_DESC_LEN    32
  40.  
  41. /* Power Management */
  42.  
  43. struct acpi_processor_cx;
  44.  
  45. struct acpi_power_register {
  46.     u8 descriptor;
  47.     u16 length;
  48.     u8 space_id;
  49.     u8 bit_width;
  50.     u8 bit_offset;
  51.     u8 reserved;
  52.     u64 address;
  53. } __attribute__ ((packed));
  54.  
  55. struct acpi_processor_cx_policy {
  56.     u32 count;
  57.     struct acpi_processor_cx *state;
  58.     struct {
  59.         u32 time;
  60.         u32 ticks;
  61.         u32 count;
  62.         u32 bm;
  63.     } threshold;
  64. };
  65.  
  66. struct acpi_processor_cx {
  67.     u8 valid;
  68.     u8 type;
  69.     u32 address;
  70.     u8 entry_method;
  71.     u8 index;
  72.     u32 latency;
  73.     u32 latency_ticks;
  74.     u32 power;
  75.     u32 usage;
  76.     u64 time;
  77.     struct acpi_processor_cx_policy promotion;
  78.     struct acpi_processor_cx_policy demotion;
  79.     char desc[ACPI_CX_DESC_LEN];
  80. };
  81.  
  82. struct acpi_processor_power {
  83.     struct cpuidle_device dev;
  84.     struct acpi_processor_cx *state;
  85.     unsigned long bm_check_timestamp;
  86.     u32 default_state;
  87.     u32 bm_activity;
  88.     int count;
  89.     struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
  90.     int timer_broadcast_on_state;
  91. };
  92.  
  93. /* Performance Management */
  94.  
  95. struct acpi_psd_package {
  96.     acpi_integer num_entries;
  97.     acpi_integer revision;
  98.     acpi_integer domain;
  99.     acpi_integer coord_type;
  100.     acpi_integer num_processors;
  101. } __attribute__ ((packed));
  102.  
  103. struct acpi_pct_register {
  104.     u8 descriptor;
  105.     u16 length;
  106.     u8 space_id;
  107.     u8 bit_width;
  108.     u8 bit_offset;
  109.     u8 reserved;
  110.     u64 address;
  111. } __attribute__ ((packed));
  112.  
  113. struct acpi_processor_px {
  114.     acpi_integer core_frequency;    /* megahertz */
  115.     acpi_integer power;    /* milliWatts */
  116.     acpi_integer transition_latency;    /* microseconds */
  117.     acpi_integer bus_master_latency;    /* microseconds */
  118.     acpi_integer control;    /* control value */
  119.     acpi_integer status;    /* success indicator */
  120. };
  121.  
  122. struct acpi_processor_performance {
  123.     unsigned int state;
  124.     unsigned int platform_limit;
  125.     struct acpi_pct_register control_register;
  126.     struct acpi_pct_register status_register;
  127.     unsigned int state_count;
  128.     struct acpi_processor_px *states;
  129.     struct acpi_psd_package domain_info;
  130.     cpumask_t shared_cpu_map;
  131.     unsigned int shared_type;
  132. };
  133.  
  134. /* Throttling Control */
  135.  
  136. struct acpi_tsd_package {
  137.     acpi_integer num_entries;
  138.     acpi_integer revision;
  139.     acpi_integer domain;
  140.     acpi_integer coord_type;
  141.     acpi_integer num_processors;
  142. } __attribute__ ((packed));
  143.  
  144. struct acpi_ptc_register {
  145.     u8 descriptor;
  146.     u16 length;
  147.     u8 space_id;
  148.     u8 bit_width;
  149.     u8 bit_offset;
  150.     u8 reserved;
  151.     u64 address;
  152. } __attribute__ ((packed));
  153.  
  154. struct acpi_processor_tx_tss {
  155.     acpi_integer freqpercentage;    /* */
  156.     acpi_integer power;    /* milliWatts */
  157.     acpi_integer transition_latency;    /* microseconds */
  158.     acpi_integer control;    /* control value */
  159.     acpi_integer status;    /* success indicator */
  160. };
  161. struct acpi_processor_tx {
  162.     u16 power;
  163.     u16 performance;
  164. };
  165.  
  166. struct acpi_processor;
  167. struct acpi_processor_throttling {
  168.     unsigned int state;
  169.     unsigned int platform_limit;
  170.     struct acpi_pct_register control_register;
  171.     struct acpi_pct_register status_register;
  172.     unsigned int state_count;
  173.     struct acpi_processor_tx_tss *states_tss;
  174.     struct acpi_tsd_package domain_info;
  175.     cpumask_t shared_cpu_map;
  176.     int (*acpi_processor_get_throttling) (struct acpi_processor * pr);
  177.     int (*acpi_processor_set_throttling) (struct acpi_processor * pr,
  178.                           int state);
  179.  
  180.     u32 address;
  181.     u8 duty_offset;
  182.     u8 duty_width;
  183.     u8 tsd_valid_flag;
  184.     unsigned int shared_type;
  185.     struct acpi_processor_tx states[ACPI_PROCESSOR_MAX_THROTTLING];
  186. };
  187.  
  188. /* Limit Interface */
  189.  
  190. struct acpi_processor_lx {
  191.     int px;            /* performance state */
  192.     int tx;            /* throttle level */
  193. };
  194.  
  195. struct acpi_processor_limit {
  196.     struct acpi_processor_lx state;    /* current limit */
  197.     struct acpi_processor_lx thermal;    /* thermal limit */
  198.     struct acpi_processor_lx user;    /* user limit */
  199. };
  200.  
  201. struct acpi_processor_flags {
  202.     u8 power:1;
  203.     u8 performance:1;
  204.     u8 throttling:1;
  205.     u8 limit:1;
  206.     u8 bm_control:1;
  207.     u8 bm_check:1;
  208.     u8 has_cst:1;
  209.     u8 power_setup_done:1;
  210.     u8 bm_rld_set:1;
  211. };
  212.  
  213. struct acpi_processor {
  214.     acpi_handle handle;
  215.     u32 acpi_id;
  216.     u32 id;
  217.     u32 pblk;
  218.     int performance_platform_limit;
  219.     int throttling_platform_limit;
  220.     /* 0 - states 0..n-th state available */
  221.  
  222.     struct acpi_processor_flags flags;
  223.     struct acpi_processor_power power;
  224.     struct acpi_processor_performance *performance;
  225.     struct acpi_processor_throttling throttling;
  226.     struct acpi_processor_limit limit;
  227.     struct thermal_cooling_device *cdev;
  228.     /* the _PDC objects for this processor, if any */
  229.     struct acpi_object_list *pdc;
  230. };
  231.  
  232. struct acpi_processor_errata {
  233.     u8 smp;
  234.     struct {
  235.         u8 throttle:1;
  236.         u8 fdma:1;
  237.         u8 reserved:6;
  238.         u32 bmisx;
  239.     } piix4;
  240. };
  241.  
  242. extern int acpi_processor_preregister_performance(struct
  243.                           acpi_processor_performance
  244.                           *performance);
  245.  
  246. extern int acpi_processor_register_performance(struct acpi_processor_performance
  247.                            *performance, unsigned int cpu);
  248. extern void acpi_processor_unregister_performance(struct
  249.                           acpi_processor_performance
  250.                           *performance,
  251.                           unsigned int cpu);
  252.  
  253. /* note: this locks both the calling module and the processor module
  254.          if a _PPC object exists, rmmod is disallowed then */
  255. int acpi_processor_notify_smm(struct module *calling_module);
  256.  
  257. /* for communication between multiple parts of the processor kernel module */
  258. DECLARE_PER_CPU(struct acpi_processor *, processors);
  259. extern struct acpi_processor_errata errata;
  260.  
  261. void arch_acpi_processor_init_pdc(struct acpi_processor *pr);
  262.  
  263. #ifdef ARCH_HAS_POWER_INIT
  264. void acpi_processor_power_init_bm_check(struct acpi_processor_flags *flags,
  265.                     unsigned int cpu);
  266. int acpi_processor_ffh_cstate_probe(unsigned int cpu,
  267.                     struct acpi_processor_cx *cx,
  268.                     struct acpi_power_register *reg);
  269. void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx *cstate);
  270. #else
  271. static inline void acpi_processor_power_init_bm_check(struct
  272.                               acpi_processor_flags
  273.                               *flags, unsigned int cpu)
  274. {
  275.     flags->bm_check = 1;
  276.     return;
  277. }
  278. static inline int acpi_processor_ffh_cstate_probe(unsigned int cpu,
  279.                           struct acpi_processor_cx *cx,
  280.                           struct acpi_power_register
  281.                           *reg)
  282. {
  283.     return -1;
  284. }
  285. static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx
  286.                            *cstate)
  287. {
  288.     return;
  289. }
  290. #endif
  291.  
  292. /* in processor_perflib.c */
  293.  
  294. #ifdef CONFIG_CPU_FREQ
  295. void acpi_processor_ppc_init(void);
  296. void acpi_processor_ppc_exit(void);
  297. int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
  298. #else
  299. static inline void acpi_processor_ppc_init(void)
  300. {
  301.     return;
  302. }
  303. static inline void acpi_processor_ppc_exit(void)
  304. {
  305.     return;
  306. }
  307. static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
  308. {
  309.     static unsigned int printout = 1;
  310.     if (printout) {
  311.         printk(KERN_WARNING
  312.                "Warning: Processor Platform Limit event detected, but not handled.\n");
  313.         printk(KERN_WARNING
  314.                "Consider compiling CPUfreq support into your kernel.\n");
  315.         printout = 0;
  316.     }
  317.     return 0;
  318. }
  319. #endif                /* CONFIG_CPU_FREQ */
  320.  
  321. /* in processor_throttling.c */
  322. int acpi_processor_tstate_has_changed(struct acpi_processor *pr);
  323. int acpi_processor_get_throttling_info(struct acpi_processor *pr);
  324. extern int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
  325. extern struct file_operations acpi_processor_throttling_fops;
  326. extern void acpi_processor_throttling_init(void);
  327. /* in processor_idle.c */
  328. int acpi_processor_power_init(struct acpi_processor *pr,
  329.                   struct acpi_device *device);
  330. int acpi_processor_cst_has_changed(struct acpi_processor *pr);
  331. int acpi_processor_power_exit(struct acpi_processor *pr,
  332.                   struct acpi_device *device);
  333. int acpi_processor_suspend(struct acpi_device * device, pm_message_t state);
  334. int acpi_processor_resume(struct acpi_device * device);
  335. extern struct cpuidle_driver acpi_idle_driver;
  336.  
  337. /* in processor_thermal.c */
  338. int acpi_processor_get_limit_info(struct acpi_processor *pr);
  339. extern struct file_operations acpi_processor_limit_fops;
  340. extern struct thermal_cooling_device_ops processor_cooling_ops;
  341. #ifdef CONFIG_CPU_FREQ
  342. void acpi_thermal_cpufreq_init(void);
  343. void acpi_thermal_cpufreq_exit(void);
  344. #else
  345. static inline void acpi_thermal_cpufreq_init(void)
  346. {
  347.     return;
  348. }
  349. static inline void acpi_thermal_cpufreq_exit(void)
  350. {
  351.     return;
  352. }
  353. #endif
  354.  
  355. #endif
  356.